package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.bean.*;
import com.itheima.dto.SetmealDto;
import com.itheima.exception.MyException;
import com.itheima.mapper.CategoryMapper;
import com.itheima.mapper.SetMealMapper;
import com.itheima.service.CategoryService;
import com.itheima.service.SetMealDishService;
import com.itheima.service.SetMealService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author hebing
 * @version 1.0
 */
@Service
public class SetmealServiceImpl implements SetMealService {
    @Autowired
    private SetMealMapper sm;

    @Autowired
    private SetMealDishService setMealDishService;

    @Autowired
    private CategoryMapper categoryMapper;
    @Override
    public int selectCount(Long id) {
        //构建查询条件对象
        LambdaQueryWrapper<Setmeal> lqw=new LambdaQueryWrapper<>();
        lqw.eq(Setmeal::getCategoryId,id);
        //调用dao查询数据库是否存在该id的值
        return sm.selectCount(lqw);
    }

    /**
     * 添加
     *
     * @param setmealDto
     * @return
     */
    @Override
    public int addSetmeal(SetmealDto setmealDto) {
        //添加数据需要添加两张表
        //向setMeal表中添加数据
        int rows = sm.insert(setmealDto);
        List<SetmealDish> setmealDishList = setmealDto.getSetmealDishes();
        if(setmealDishList!=null&&setmealDishList.size()!=0){
            for (SetmealDish setmealDish : setmealDishList) {
                //需要给setMeal的setMeal_id赋值  因为他自身携带的数据没有这个id需要做绑定处理
                setmealDish.setSetmealId(setmealDto.getId());
                //向SetmealDish表中添加数据
                setMealDishService.addSetMealDish(setmealDish);
            }
        }
        return rows;
    }

    /**
     * 分页查询
     *
     * @param params
     * @return
     */
    @Override
    public IPage<SetmealDto> findPage(PageParams params) {
        //分页查询 这里需要查询两张表
        //构建分页查询条件
        IPage<Setmeal> setmealIPage=new Page<>(params.getPage(),params.getPageSize());
        //构建条件对象
        LambdaQueryWrapper<Setmeal> lqw=new LambdaQueryWrapper<>();
        //模糊查询设置条件 设置名字是否存在情况下的查询
        lqw.like(params.getName()!=null,Setmeal::getName,params.getName());
        //查询setMeal表数据
        sm.selectPage(setmealIPage, lqw);
        //根据categoryId查询category表categoryName名字
        List<Setmeal> setmealList = setmealIPage.getRecords();
        //创建Ipage<SetmealDto>对象
        IPage<SetmealDto> setmealDtoIPage=new Page<>();
        //封装总条数
        setmealDtoIPage.setTotal(setmealIPage.getTotal());
        //使用留的方式对数据进行转移封装到更大的数据setMealDto中
        List<SetmealDto> setmealDtoList = setmealList.stream().map(item -> {
            //创建setMealDto对象 进行转移
            SetmealDto setmealDto = new SetmealDto();
            //拷贝数据  遍历一次封装一次
            BeanUtils.copyProperties(item, setmealDto);
            //调用categoryService进行查询得到名字
            Category category = categoryMapper.selectById(item.getCategoryId());
            //还需要一个数据 categoryName
            setmealDto.setCategoryName(category.getName());
            //封装完成 返回数据对象 将其封装成一个集合
            return setmealDto;
        }).collect(Collectors.toList());
        //封装需要的总数据
        setmealDtoIPage.setRecords(setmealDtoList);
        //返回数据
        return setmealDtoIPage;
    }

    /**
     * 根据id删除
     *
     * @param ids
     * @return
     */
    @Override
    public int deleteById(List<Long> ids) {
        //构建查询条件对象
        LambdaQueryWrapper<Setmeal> lqw=new LambdaQueryWrapper<>();
        //根据ids查询到所有对象
        List<Setmeal> setmealList = sm.selectBatchIds(ids);
        //遍历
        for (Setmeal setmeal : setmealList) {
            Integer status = setmeal.getStatus();
            //判断 如果有一个状态为起售状态 抛出异常禁止删除
            if(status==1){
                throw new MyException("存在起售套餐禁止删除");
            }
        }
        //其他直接删除
        return sm.deleteBatchIds(ids);
    }

    /**
     * 批量起售
     *
     * @param ids
     * @return
     */
    @Override
    public int updateStatusToOn(List<Long> ids) {
        //根据ids查询数据库
        List<Setmeal> setmealList = sm.selectBatchIds(ids);
        //判断并遍历
        if (setmealList != null && setmealList.size() > 0) {
            for (Setmeal setmeal : setmealList) {
                //修改状态
                setmeal.setStatus(1);
                //修改表 这里不能返回 需要全部修改完成
                sm.updateById(setmeal);
            }
            //遍历完了返回
            return 1;
        }
        //长度为0
        return 0;
    }

    /**
     * 批量停售
     *
     * @param ids
     * @return
     */
    @Override
    public int updateStatusToOff(List<Long> ids) {
        //根据ids查询数据库
        List<Setmeal> setmealList = sm.selectBatchIds(ids);
        //判断并遍历
        if (setmealList != null && setmealList.size() > 0) {
            for (Setmeal setmeal : setmealList) {
                //修改状态
                setmeal.setStatus(0);
                //修改表 这里不能返回 需要全部修改完成
                sm.updateById(setmeal);
            }
            //遍历完了返回
            return 1;
        }
        //长度为0
        return 0;
    }

    /**
     * 根据id和状态查询数据
     *
     * @param categoryId
     * @param status
     * @return
     */
    @Override
    public List<Setmeal> findByCategoryId(Long categoryId, Integer status) {
        //构建查询语句条件
        LambdaQueryWrapper<Setmeal> lqw=new LambdaQueryWrapper<>();
        //有没有categoryId 有就拼接
        lqw.eq(categoryId!=null,Setmeal::getCategoryId,categoryId);
        //有没有status 有就拼接
        lqw.eq(status!=null,Setmeal::getStatus,status);
        return sm.selectList(lqw);
    }
}
